在「Day 5 - Android - 世界的元素裡有提到,Android 的世界中有四個主要元素,而我們平常介紹的一直都是最常用的 元素-Activity,而今天要為各位帶來第二個元素:「Content Providers」
註:本來於昨日的最後說到,今天介紹如何自定 ListView 的介面,因為圖片的部份尚未準備好,所以今天就先為各位帶來這篇,抱歉~
內容提供者(Content Providers)廣義來說,可以泛指所有存放在硬體中的資料集,而資料來源可能是文件檔案、SQLite…等等,而今天要介紹一個最容易使用「SharedPreferences」。這也是 Android 世界裡所提供的一個簡易又方便的方法,他供我們可以用 key-value 的方式,將基本型別的資料存放在硬體上面。
而他的使用也是分成三個簡單的部份即可
一、宣告
二、動作
三、清除
一、宣告
宣告的方式相當容易,在要使用(不論是要做新增/修改/刪除的哪個動作都要先宣告
SharedPreferences content = getSharedPreferences("CONTENT_NAME", MODE);
就是這樣而已,在一開始的宣告就先給予這個 SharedPreferences 名稱(CONTENT_NAME),以及一個狀態(MODE),前者自行定義即可,後者[官方](http://developer.android.com/reference/android/content/Context.html#getSharedPreferences(java.lang.String, int))提供了四種模式(MODE)來讓我們對這個 SharedPreferences 定義他的被存取權限(範圍)!
//私有權限,只有自己這個 APP 可以使用
MODE_PRIVATE
//開放給其他 APP 只能讀取的權限
MODE_WORLD_READABLE
//開放讓其他 APP 能夠存取
MODE_WORLD_WRITEABLE
//同時讓多個 APP 可以存取
MODE_MULTI_PROCESS
二、動作
相信大家都能猜到三個基本動作~新增/修改/刪除元件,另外還有一個是讀取,而前面的三個基本動作在程式指令就是一個很簡單的結構:data.edit().動作.commit();
//新增或修改整數
data.edit().putInt("COUNT", 3).commit();
//新增或修改字串
data.edit().putString("NAME", "Moogle").commit();
//刪除元素
data.edit().remove("COUNT").commit();
他還可以連續動作
data.edit()
.putInt("COUNT", 3).putString("NAME", "Moogle")
.remove("COUNT").remove("NAME")
.commit();
上面這個例子只是單純搞笑,別當真,真的這麼寫是沒意義的XD
另外,他的新增跟修改都是同一個指令 putTheType(KEY, VALUE),當該 KEY 是存在的話,就是修改;反之,則新增。
另外一個動作是讀取
data.getInt("COUNT", 0);
就是直接用getTheType的方式,第一個參數仍是 Key,而第二個參數要給同型別的 VALUE,用意在當讓 Key 的資料是不存在的話,就直接給這個預設值,以避免錯誤的發生,相當體貼的設計,對吧
三、清除
data.edit().clear().commit()
可能有人會問,上面不是有個remove了嗎?是的,沒錯,那個是針對 SharedPreferences 裡的元素來"移除",所以這邊官方的指令才會用 clear(清除)這個 SharedPreferences呀!別忘了~咱們現在介紹的是 Content Providers 這個元素,就算是在關掉這個 APP 的同時,資料保留在我們硬體裡的!並不會因為 APP 的關閉就被清除哦~除非是這個 APP 被移除了,好饒口的一段
這個元素自然是為了讓我們能夠活躍在 Android 的世界中,而這個元素多伴都是在讓 Activity 更加方便地來做一些「設定」,是的!設定!所以在硬梆梆的使用介紹後,來看看如何將之應用在之前的範例之中。
今天的範例依舊是延續著昨天的程式碼,請將之在新增為一個新的專案「Day26_ContentProviders」,今天要再加入一位新的成員「Moogle4」,我們請他來為我們做"語系"的設定,這個設定在做什麼用呢?若是各位跟在下一樣都是用模擬器,而且沒有去動過模擬器的語系設定的話,那他的預設是在values-en-rUS,而我們在之前也建立了這麼一個語系目錄,所以在進入到 ChocoboActivity 時,下拉選單的並不是顯示在第一個選項「正體中文」而是跟預設環境一樣的美區英文,也不是預設目錄。
而這個 Moogle4 的介面(activity_moogle4.xml)長這樣
就是三個語系的單選(RadioButton)以及一個按鈕。再來是程式的部份,setView()的部份
private void setView() {
mRdgLanguage = (RadioGroup) findViewById(R.id.rdg_setting_language);
mBtnSetting = (Button) findViewById(R.id.btn_setting_ok);
mBtnSetting.setOnClickListener(btnClick);
}
按鈕的偵聽式
private View.OnClickListener btnClick =
new View.OnClickListener() {
public void onClick(View v) {
/* 取得語系選擇值 */
int lang = 0;
switch(mRdgLanguage.getCheckedRadioButtonId()){
case R.id.rdo_tw:
lang = 1;
break;
case R.id.rdo_jp:
lang = 2;
break;
case R.id.rdo_us:
lang = 3;
break;
}
/* 宣告,SharedPreferences
* 第一個參數:key的部份請自行定義,
* 第二個參數:MODE_PRIVATE,設為私有,讓我們自己這個app可以使用即可
*/
SharedPreferences preferences = getSharedPreferences("MOSIL", MODE_PRIVATE);
preferences.edit().putInt("LANG", lang).commit();
/* 設定完成就直接離開本頁 */
finish();
}
};
到這邊就完成 Moogle4 的動作嘍!再來怎麼串連到 Moogle4 來呢?很簡單,只要在 menut 目錄裡的 moogle.xml 追加一個選單項目即可
<item android:id="@+id/menu_setting_language"
android:title="@string/menu_language" />
拉著到 MoogleActivity 的 onOptionsItemSelected 區段再追加一個動作
case R.id.menu_setting_language:
Intent intentToSetting = new Intent(this, Moogle4Activity.class);
startActivity(intentToSetting);
break;
到這邊,我們先執行看看,畫面以及動作是否依我們所想的去進行
嗯!多了一個「設定語系」選單項目了,點進去就能看到下面這個畫面啦
再來就剩最後一個動作了,到 ChocoboActivity 裡的 setView() 一開始追加這一段
//私有權限,只有自己這個 APP 可以使用
MODE_PRIVATE
//開放給其他 APP 只能讀取的權限
MODE_WORLD_READABLE
//開放讓其他 APP 能夠存取
MODE_WORLD_WRITEABLE
//同時讓多個 APP 可以存取
MODE_MULTI_PROCESS
0
這麼一來,到 Chocobo 就不會有問題嘍
再來,一個小作業,請各位嘗試做做看,我們現在的 app 還有一個問題
就是到語系設定頁時,我們的單選元件沒法忠實地呈現我們現在 SharePreferences 的設定,這是其一。
其二,請各位嘗試著將「Day 24 - Android - 溝通」的範例中原本 Moogle2 回傳給 Chocobo 呈現的那段文字,用今天的方式,使之回到 Moogle 時,可以讓該文字呈現到「傳遞內容」的輸入框中哦!
今天除了第二個元素外,還同時讓各位複習了 menu 以及 radiogroup 的使用,不知道各位是否能更有印象了呢?
Day 25 - Android - 簡介與列表《 》Day 27 - Android - 自我
這兩天是怎麼回事啊
進入編輯時的最後一塊程式內容都是正確的,可是真的顯示時都是錯的
只好在這裡補上了
<pre class="c" name="code">
private void setView() {
mPreferences = getSharedPreferences("MOSIL", MODE_PRIVATE);
int lang = mPreferences.getInt("LANG", 0);
//取得系統資源
Resources resource = getResources();
//取得資源設定
Configuration conf = resource.getConfiguration();
switch(lang){
case 1:
conf.locale = Locale.TAIWAN;
break;
case 2:
conf.locale = Locale.JAPAN;
break;
case 0:
case 3:
default:
conf.locale = Locale.US;
break;
}
DisplayMetrics dm =resource.getDisplayMetrics();
//更新
resource.updateConfiguration(conf, dm);
...